/**
 * 交易限制校验组件
 * 
 * @author wqhui
 */
define(function(require, exports, module) {
	var aCity = {11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"};

	module.exports = {
		isCardID : function(sId) {
			// 18位身份证判断
			if (sId.length == 18) {
				var iSum = 0;
				if (!/^\d{17}(\d|x)$/i.test(sId))
					return "你输入的身份证长度或格式错误";
				sId = sId.replace(/x$/i, "a");
				if (aCity[parseInt(sId.substr(0, 2))] == null)
					return "你的身份证地区非法";
				sBirthday = sId.substr(6, 4) + "-" + Number(sId.substr(10, 2)) + "-" + Number(sId.substr(12, 2));
				var d = new Date(sBirthday.replace(/-/g, "/"));
				if (sBirthday != (d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate()))
					return "身份证上的出生日期非法";
				for ( var i = 17; i >= 0; i--)
					iSum += (Math.pow(2, i) % 11) * parseInt(sId.charAt(17 - i), 11);
				if (iSum % 11 != 1)
					return "你输入的身份证号非法";
				return true;
			}
			// 15位身份证判断
			else if (sId.length == 15) {
				if (!/^\d{15}$/i.test(sId))
					return "你输入的身份证长度或格式错误";
				if (aCity[parseInt(sId.substr(0, 2))] == null)
					return "你的身份证地区非法";
				sBirthday = "19" + sId.substr(6, 2) + "-" + Number(sId.substr(8, 2)) + "-" + Number(sId.substr(10, 2));
				var d = new Date(sBirthday.replace(/-/g, "/"));
				if (sBirthday != (d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate()))
					return "身份证上的出生日期非法";
				return true;
			} else {
				return "身份证长度不合法";
			}
		},

        checkCertificate : function (type, val) {
            val = $.trim(val);
            if (val == null || val.length == 0) {
                return "请正确输入证件号码！";
            }

            if (type == "0") {
                reg = /^(\d{15}|\d{18}|\d{17}[a-zA-Z]{1})$/;
                if (!reg.test(val))    return "身份证号码不合规范";
                var result = this.isCardID(val) == true ? true : false;
                if (!result)   return "身份证号码不合规范";
            }
            else if (type == "1") {
                reg = /^([\u4e00-\u9fa5\uff08\uff09\u0028\u0029\w\d\-]{1,})$/;
                if (!reg.test(val))    return "护照号码不合规范";
            }
            else if (type == "2") {
                reg = /^([\u4e00-\u9fa5\uff08\uff09\u0028\u0029\w\d\-]{1,})$/;
                if (!reg.test(val))    return "军官证号码不合规范";
            }
            else if (type == "3") {
                reg = /^([\u4e00-\u9fa5\uff08\uff09\u0028\u0029\w\d\-]{1,})$/;
                if (!reg.test(val))    return "士兵证号码不合规范";
            }
            else if (type == "4") {
                reg = /^([\u4e00-\u9fa5\uff08\uff09\u0028\u0029\w\d\-]{1,})$/;
                if (!reg.test(val))    return "回乡证号码不合规范";
            }
            else if (type == "5") {
                reg = /^([\u4e00-\u9fa5\uff08\uff09\u0028\u0029\w\d\-]{1,})$/;
                if (!reg.test(val))    return "户口本号码不合规范";
            }
            else if (type == "7") {
                reg = /^([\u4e00-\u9fa5\uff08\uff09\u0028\u0029\w\d\-]{1,})$/;
                if (!reg.test(val))    return "其它证件号码不合规范";
            }
            else if (type == "8") {
                reg = /^([\u4e00-\u9fa5\uff08\uff09\u0028\u0029\w\d\-]{1,})$/;
                if (!reg.test(val))    return "文职证号码不合规范";
            }
            else if (type == "9") {
                reg = /^([\u4e00-\u9fa5\uff08\uff09\u0028\u0029\w\d\-]{1,})$/;
                if (!reg.test(val))    return "警官证号码不合规范";
            }
            return null;
        },
		
		// 短时间，形如 (13:04:06)
		isTime : function(str) {
			var a = str.match(/^(\d{1,2})(:)?(\d{1,2})\2(\d{1,2})$/);
			if (a == null) {
				return false;
			}
			if (a[1] > 24 || a[3] > 60 || a[4] > 60) {
				return false;
			}
			return true;
		},
		
		// 短日期，形如 (2003-12-05),年月日中间可有-或/
		reIsDate : function(str) {
			var r = str.match(/^(\d{1,4})([\-|\/]{0,1})(\d{1,2})\2(\d{1,2})$/);
			if (r == null)
				return false;
			var d = new Date(r[1], r[3] - 1, r[4]);
			return (d.getFullYear() == r[1] && (d.getMonth() + 1) == r[3] && d.getDate() == r[4]);
		},

		/**
		 * 短日期,形如(2012-02-02或2012-2-2) 年月日中间必须以'-'分隔
		 */
		reIsDate : function(str) {
			var r = str.match(/^(\d{4})([-])(\d{1,2})\2(\d{1,2})$/);
			if (r == null)
				return false;
			var d = new Date(r[1], r[3] - 1, r[4]);
			return (d.getFullYear() == r[1] && (d.getMonth() + 1) == r[3] && d.getDate() == r[4]);
		},

		// 长时间，形如 (2003-12-05 13:04:06)
		isDateTime : function(str) {
			var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/;
			var r = str.match(reg);
			if (r == null)
				return false;
			var d = new Date(r[1], r[3] - 1, r[4], r[5], r[6], r[7]);
			return (d.getFullYear() == r[1] && (d.getMonth() + 1) == r[3]
					&& d.getDate() == r[4] && d.getHours() == r[5]
					&& d.getMinutes() == r[6] && d.getSeconds() == r[7]);
		},
		
		/**
		 * 替换资源中的变量
		 */
		getMessage : function(msg, args) {
			var result = msg;
			for (var i = 0; i < args.length; i++) {
				var arg = args[i];
				result = result.replace("{" + i + "}", arg);
			}
			return result;
		},
		
		/**
		 * 判断是否有值。
		 * val：需要判断的值。
		 */
		required : function (val) {
			//val为null，""，undefinded 均默认返回false。
			return val && (val.length > 0); 
		},
		
		/**
		 * 判断是否符合最小长度。
		 * val：需要判断的值。
		 * len：最小长度。
		 * isInclude：是否包含最小长度值的范围。
		 */
		minLength : function (val , len , isInclude) {
			if (isInclude) {
				return (val != null) && (val.length >= len) ;
			} else {
				return (val != null) && (val.length > len) ;
			}
		},
		
		/**
		 * 判断是否符合最大长度。
		 * val：需要判断的值。
		 * len：最大长度。
		 * isInclude：是否包含最大长度值的范围。
		 */
		maxLength : function (val , len , isInclude) {
			if (isInclude) {
				return (val != null) && (val.length <= len) ;
			} else {
				return (val != null) && (val.length < len) ;
			}
		},
		
		/**
		 * 比较两个字符串的大小。如果arg1大于arg2，则返回true；如果是小于，则返回false。
		 * arg1：比较值1。
		 * arg2：比较值2。
		 * isInclude：如果两个值相等，则是否返回true。
		 * 
		 */
		compare : function (arg1 , arg2 , isInclude) {
			//必须确保比较的数值是数值类型，否则会出现比较结果不正确的情况。
			var arg1Num = (typeof arg1 =="number") ? arg1 : new Number(arg1);
			var arg2Num = (typeof arg1 =="number") ? arg2 : new Number(arg2);
			
			if (isInclude) {
				return arg1Num >= arg2Num;
			} else {
				return arg1Num > arg2Num;
			}
			
		},
		
		/**
		 * 判断此参数是否为整数的格式。返回true表示整数。
		 *  val:需要判断的值。
		 */
		isIntNorm : function (val) {
			var reg = /^[+-]?[1-9][0-9]*$/;
			return reg.test(val);
		},
		
		/**
		 * 判断此参数是否为数值格式。返回true表示整数。
		 *  val:需要判断的值。
		 */
		isNumberNorm : function (val) {
			var reg = /(^[+-]?[1-9][0-9]*\\.?[0-9]*$)|(^[+-]?0\\.[0-9]*[1-9]+[0-9]*$)/;
			return reg.test(val);
		},

        isHttpUrl : function(s) {
            var matches = /^http[s]?:\/\/[\w-]+(\.[\w-]+)+([\w-\.\/?%&=]*)?$/;
            return matches.test(s);
        },

        isMobile : function(s) {
            return (/^(13|14|15|16|18|17|19)[0-9]{9}$/.test(s));
        },

        isEmail : function (s) {
            return (/^$|^[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9\-_]+(\.[a-zA-Z0-9\-_]{2,})+([\.][a-zA-Z\-_]{2,})?$/.test(s));
        },
        isDate : function (s) {
            return (/^(\d{4})-(\d{2})-(\d{2})$/.test(s));
        },
        isPhone : function (s) {
            return (/^\d{3,5}[-]\d{4,8}$/g.test(s));
        },
        isPhones : function (s) {
            return (/^\d{0,5}[-]\d{4,11}$/g.test(s));
        },
        isBankName : function(s){
        	return (/^(|[\u4e00-\u9fa5\.]{2,}|[a-zA-Z\.]{4,})$/.test(s));
        },
        isBankAcco : function(s){
        	return (/^[\d]{12,19}$/.test(s));
        },
        isPassword : function(s){
        	return (/^[0-9a-zA-Z]{0,50}$/.test(s));
        },
        isZipcode : function(s){
        	return (/^\d{6}$/.test(s));
        },
        isAddress : function(s){//验证汉字
        	return (/^([一-龥\w\s\.\-\(\)\#\\\|]{2,30})$/.test(s));
        },
        isContactName : function (s){
        	return (/^[一-龥\wa-zA-Z\(\)\.\¡¤\s·]{2,30}$/.test(s));
        }
    };
});